package com.gzy.literature.exception;

import java.io.Serializable;

public class DataAccessException extends RuntimeException implements Serializable {
    private static final long serialVersionUID = 1L; // 序列化版本ID
    private final String errorCode; // 错误代码，可以根据需要定义

    // 枚举类型，用于定义可能的错误类型（可选）
    public enum ErrorType {
        DATABASE_CONNECTION_FAILED,
        QUERY_EXECUTION_FAILED,
        DATA_NOT_FOUND,
        // 可以添加更多类型
    }

    private final ErrorType errorType;

    // 无参数构造函数
    public DataAccessException() {
        this(null, null, null);
    }

    // 只有错误消息的构造函数
    public DataAccessException(String message) {
        this(message, null, null);
    }

    // 错误消息和原因的构造函数
    public DataAccessException(String message, Throwable cause) {
        this(message, cause, null);
    }

    // 完整构造函数，包括错误代码和错误类型
    public DataAccessException(String message, Throwable cause, String errorCode) {
        this(message, cause, errorCode, null);
    }

    // 最完整的构造函数，包括错误消息、原因、错误代码和错误类型
    public DataAccessException(String message, Throwable cause, String errorCode, ErrorType errorType) {
        super(message, cause);
        this.errorCode = errorCode;
        this.errorType = errorType != null ? errorType : ErrorType.DATABASE_CONNECTION_FAILED; // 默认类型
    }

    // 获取错误代码
    public String getErrorCode() {
        return errorCode;
    }

    // 获取错误类型
    public ErrorType getErrorType() {
        return errorType;
    }

    // 重写toString方法，提供更详细的异常信息
    @Override
    public String toString() {
        return "DataAccessException{" +
                "message='" + getMessage() + '\'' +
                ", cause=" + getCause() +
                ", errorCode='" + errorCode + '\'' +
                ", errorType=" + errorType +
                '}';
    }
}